﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Administration.Entities;
using HerGoS.DAO;
using HerGoS.Interfaces;
using System.Data;
using HerGoS.Administration.Exceptions;

namespace HerGoS.Administration.Engine
{
    public class GestorModalidadCobro
    {

        public static ModalidadCobro Obtener(int OID)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "TMODALIDADCOBROS_SP";
                repo.AddParameter("@ACCION", "BYID");
                repo.AddParameter("@ID", OID);
                DataTable dt = repo.ExecuteDataTable();
                ModalidadCobro result = dt.ToGenericList<ModalidadCobro>(ModalidadCobroConverter).FirstOrDefault();
                return result;
            }
            catch (Exception ex)
            {
                throw new ModalidadCobroGetException(ex);
            }
        }

        public static void Guardar(ModalidadCobro modalidadCobro)
        {
            try
            {
                IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryName);
                repo.Nombre = "BANCOS_PROC";
                repo.AddParameter("@ACCION", modalidadCobro.Persistencia);
                repo.AddParameter("@ID", modalidadCobro.OID);
                repo.AddParameter("@CODIGO", modalidadCobro.Codigo);
                repo.AddParameter("@DESCRIPCION", modalidadCobro.Descripcion);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                modalidadCobro.OID = repo.ExecuteReturnValue().ToInteger();
                repo.Commit();

                GestorBitacora.Guardar(modalidadCobro);
            }
            catch (Exception ex)
            {
                throw new ModalidadCobroSaveException(ex);
            }
        }
        public static void Eliminar(ModalidadCobro modalidadCobro)
        {
            modalidadCobro.Persistencia = EstadoPersistencia.DELETE;
            Guardar(modalidadCobro);
            modalidadCobro.Persistencia = EstadoPersistencia.UPDATE;
            modalidadCobro.Activo = false;
        }
        public static void ReActivar(ModalidadCobro modalidadCobro)
        {
            modalidadCobro.Persistencia = EstadoPersistencia.UNDELETE;
            Guardar(modalidadCobro);
            modalidadCobro.Persistencia = EstadoPersistencia.UPDATE;
            modalidadCobro.Activo = true;
        }

        public static List<ModalidadCobro> Consultar(string codigo, string descripcion, bool? activo)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "TMODALIDADCOBROS_SP";
                repo.AddParameter("@ACCION", "CONSULTA");
                repo.AddParameter("@ID", null);
                repo.AddParameter("@CODIGO", codigo);
                repo.AddParameter("@DESCRIPCION", descripcion);
                repo.AddParameter("@ACTIVO", activo);
                DataTable dt = repo.ExecuteDataTable();
                List<ModalidadCobro> result = dt.ToGenericList<ModalidadCobro>(ModalidadCobroConverter);
                return result;
            }
            catch (Exception ex)
            {
                throw new ModalidadCobroGetException(ex);
            }
        }


        public static List<ModalidadCobro> Consultar(string codigo, string descripcion)
        {
            return Consultar(codigo, descripcion, true);
        }

        public static List<ModalidadCobro> Consultar(bool activo)
        {
            return Consultar(null, null, activo);
        }
        

        #region Converter
        public static ModalidadCobro ModalidadCobroConverter(DataRow row)
        {
            
            return new ModalidadCobro
            {
                OID = row["tmcobID"].ToInteger(),
                Persistencia = EstadoPersistencia.UPDATE,
                Codigo = row["tmcobCODIGO"].ToString(),
                Descripcion = row["tmcobDESCRIPCION"].ToString(),
                Activo = row.IsNull("FECHA_BAJA") ? true : false
            };
        }
        #endregion
        


    }
}
